package org.yelongframework.excel.data.fill.sheet;

import org.yelongframework.excel.sheet.ExcelSheet;
import org.yelongframework.util.Assert;

/**
 * 抽象实现
 * 
 * @since 1.0.0
 */
public abstract class AbstractSheetDataFiller<T extends SheetDataFillScheme> implements SheetDataFiller {

	// ==================================================填充==================================================

	@SuppressWarnings("unchecked")
	@Override
	public final void dataFill(ExcelSheet excelSheet, SheetDataFillScheme sheetDataFillScheme)
			throws SheetDataFillException {
		Assert.notNull(excelSheet, "excelSheet cannot be null");
		Assert.notNull(sheetDataFillScheme, "sheetDataFillScheme cannot be null");
		sheetDataFillScheme.check();
		try {
			doDataFill(excelSheet, (T) sheetDataFillScheme);
		} catch (ClassCastException e) {
			throw new SheetDataFillException("不匹配的工作表数据填充属性：" + e.getMessage());
		}

	}

	// ==================================================执行填充==================================================

	/**
	 * 执行数据填充
	 * 
	 * @param excelSheet        工作表
	 * @param sheetDataFillProp 数据填充方案
	 * @throws SheetDataFillException 数据填充异常
	 */
	protected abstract void doDataFill(ExcelSheet excelSheet, T sheetDataFillScheme) throws SheetDataFillException;

}
